{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Linear Regersion Using the Normal Equation  \n",
    "Formula:[$\\theta = (X^T X)^{-1} X^T y$]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal parameters theta: [[4.21509616]\n",
      " [2.77011339]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "# Generate some example data\n",
    "np.random.seed(42)\n",
    "X=2*np.random.rand(100,1)\n",
    "y=4+3*X+np.random.randn(100,1)\n",
    "\n",
    "# Add x0=1 to each instance\n",
    "X_b=np.c_[np.ones((100,1)),X]\n",
    "\n",
    "# Compute theta using the normal equation\n",
    "theta_best=np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)\n",
    "\n",
    "print(f\"Optimal parameters theta: {theta_best}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression Using Gradient Descent  \n",
    "Formula:[$\\sigma(z) = \\frac{1}{1 + e^{-z}}$]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal parameters theta: [[-2.73393974]\n",
      " [ 3.84169563]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.random.seed(42)\n",
    "X=2*np.random.rand(100,1)\n",
    "y=(4+3*X+np.random.randn(100,1)>6).astype(int)\n",
    "\n",
    "# Add x0=1 to each instance\n",
    "X_b=np.c_[np.ones((100,1)),X]\n",
    "\n",
    "# Initialize theta\n",
    "theta=np.random.randn(2,1)\n",
    "learning_rate=0.1\n",
    "n_iterations=1000\n",
    "m=100\n",
    "\n",
    "def sigmoid(x):\n",
    "    return 1/(1+np.exp(-x))\n",
    "\n",
    "\n",
    "for iteration in range(n_iterations):\n",
    "    logits=X_b.dot(theta)\n",
    "    predictions=sigmoid(logits)\n",
    "    gradients=1/m*X_b.T.dot(predictions-y)\n",
    "    theta=theta-learning_rate*gradients\n",
    "\n",
    "print(f\"Optimal parameters theta: {theta}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Principal Component Analysis(PCA)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original data: (100, 3)\n",
      "Reduced data: (100, 2)\n",
      "Explained variance ratio: [0.37743432 0.33646087]\n"
     ]
    },
    {
     "data": {
      "image/png": "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JwCIqVOnltm3uLhY3L59WwhRUpDt4uJiUEH2d999JwCIb775Rrft7t274vHHH9cryM7PzxdeXl4iKiqqwoJstVotGjRoIBo1aiTu3LlTJsacnBzdv00tyPb39zeoIHvQoEGifv36Qq1W67YdOnRIqFQqERoaqtt2//59AUBMnDhR773y8/MFAJGQkKC3/dVXX62wgJvIXrHliMhB1axZE1u3bkWvXr0QGRmpN0P28ePHsWHDBsTExAAo6VKrXbs2OnToUO5r9evXDytWrMD333+vGxYuRc+ePREREYGFCxdi3Lhx6Ny5M1555RUkJiYiNTUV3bt3h4uLC86fP4/Nmzfj448/xuDBg+Hv74+33noLiYmJ6NOnD3r16oUTJ07gxx9/hJ+fn957dO/eHY8//jhGjRqFt99+G87Ozli5ciX8/f1x+fJl3X7e3t746KOP8PLLL6Ndu3Z44YUXULNmTZw8eRL379/HmjVr4OTkhM8++ww9e/ZE8+bNER8fj7p16+LatWvYu3cvvL298e233wIomU8oKSkJnTp1wquvvoqHDx9i8eLFaN68OU6dOlXpcXFxccH777+PV155BV26dMGQIUOQkZGBVatWlak56tOnD7Zs2YKBAweid+/eyMjIwLJlyxAeHo67d+/q9vPw8EB4eDg2bdqExo0bo1atWoiIiEBERASeeuopzJs3D8XFxahbty527NihmxeLyKHYOjsjIvMytOVI6/r16+KNN94QjRs3Fu7u7qJ69eqiTZs2Yvbs2SI/P19kZ2eLatWqiZdeeqnC17h//76oXr26GDhwYKXvVVHLkRBCrF69WgAQq1at0m1bvny5aNOmjfDw8BBeXl6iRYsW4p133hHXr1/X7aNWq8XMmTNFcHCw8PDwEP/4xz/EmTNnRGhoqF7LkRBCHDt2TERHRwtXV1fx+OOPi4ULF5YZyq+1fft20aFDB+Hh4SG8vb1FVFSU2LBhg94+J06cEIMGDRK1a9cWbm5uIjQ0VDz33HNi9+7devvt379ftGnTRri6uor69euLZcuWVTi1QHn+7//+T9SrV0+4ubmJtm3bigMHDojOnTvrtRxpNBrxwQcfiNDQUOHm5iZat24tvvvuOzFixAi9liMhhPjll1908aBUq9DVq1fFwIEDha+vr/Dx8RHPPvusuH79OluOyOGohODMXkRERERanOeI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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.decomposition import PCA\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Generate some example data\n",
    "np.random.seed(42)\n",
    "X=np.random.rand(100,3)\n",
    "\n",
    "\n",
    "# Perform PCA\n",
    "\n",
    "pca=PCA(n_components=2)\n",
    "X_reduced=pca.fit_transform(X)\n",
    "\n",
    "print(f\"Original data: {X.shape}\")\n",
    "print(f\"Reduced data: {X_reduced.shape}\")\n",
    "print(f\"Explained variance ratio: {pca.explained_variance_ratio_}\")\n",
    "\n",
    "\n",
    "# Plot the reduced data\n",
    "plt.scatter(X_reduced[:,0],X_reduced[:,1])\n",
    "plt.xlabel(\"First principal component\")\n",
    "plt.ylabel(\"Second principal component\")\n",
    "plt.title(\"PCA-Reduced data\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bayesian Inference  \n",
    "Formula:[$P(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B)}$]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Posterior probability of A given D: 0.6585365853658537\n",
      "Posterior probability of B given D: 0.34146341463414626\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "# Prior probabilities\n",
    "P_A=0.3\n",
    "P_B=0.7\n",
    "\n",
    "# Likelyhoods\n",
    "P_D_given_A=0.9\n",
    "P_D_given_B=0.2\n",
    "\n",
    "\n",
    "# Evidence\n",
    "P_D=P_D_given_A*P_A+P_D_given_B*P_B\n",
    "\n",
    "# Posterior probabilities\n",
    "P_A_given_D=P_D_given_A*P_A/P_D\n",
    "P_B_given_D=P_D_given_B*P_B/P_D\n",
    "\n",
    "print(f\"Posterior probability of A given D: {P_A_given_D}\")\n",
    "print(f\"Posterior probability of B given D: {P_B_given_D}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "llm-learning",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
